package com.chilly.other.pattern.strategy;

/**
 * 运用设计模式中的策略模式。把变化的部分提取出来变为接口+实现
 *
 * 策略模式注意点：
 * 1.分析项目中变化部分与不变部分
 * 2.多用组合少用继承；用行为类组合，而不是行为的继承。更有弹性。
 * 3.设计模式没有相应的库直接使用，有些库或框架本身就用某种设计模式设计的。
 *
 *
 * https://blog.csdn.net/qq_39969226/article/details/88069038
 * <p>
 * .java文件说明：
 * Dock.java:基类鸭子
 * GreenHeadDuck.java:绿头鸭
 * RedHeadDuck.java:红头鸭
 * StimulateDuck.java:模拟鸭子（main）
 * <p>
 * 继承是实现共性，减少代码的重复。接口是实现特性。
 * <p>
 * 用策略模式来解决新需求：
 * 需要新的设计方式，应对项目的扩展性，降低复杂度：
 * 1）:分析项目变化与不变部分，提取变化部分，抽象成接口+实现；(抽象是共性，接口是特性)
 * 2）:鸭子那些功能是会根据新需求变化的？叫声、飞行
 *
 * <p>
 * Created by Chilly Cui on 2021/1/12.
 */

/**
 * 主类：模拟鸭子
 */
public class StimulateDuck {
    public static void main(String[] args) {
        //父类为Duck，屏蔽了超类的差别性
        Duck greenHeadDuck = new GreenHeadDuck();
        Duck redHeadDuck = new RedHeadDuck();

        greenHeadDuck.display();
        greenHeadDuck.Fly();
        greenHeadDuck.setQuackBeahavior(new QuackBehavior() {
            @Override
            public void quack() {
                System.out.println("我会叫");
            }
        });
//        greenHeadDuck.Quack();


        greenHeadDuck.swim();

        System.out.println();
        System.out.println();

        redHeadDuck.display();
        redHeadDuck.Quack();
        redHeadDuck.swim();
        redHeadDuck.setFlyBehavior(new FlyBehavior() {
            @Override
            public void fly() {
                System.out.println("我会飞");
            }
        });
    }
}

